#include "stc8g.h"

/* 指定对应的引脚. 这个引脚是固定的
  SCL 引脚  =  P3.2
  SDA 引脚  =  P3.3
  这个引脚可以更换为 
  SCL 引脚  =  P5.4
  SDA 引脚  =  P5.5
  需要 P_SW2 |= 1<<4;
  对应的引脚也要设置为开漏输出
*/
// I2C初始化函数
void I2C_Init(void) {
	
	  P_SW2 |= 0x80;  //这一句不能省略，否则会导致I2C无法正常工作

    //默认输出引脚,配置P3.2(SCL)和P3.3(SDA)为开漏输出
    // P3M1 |= 0x0C;   // P3.2和P3.3设置为开漏输出
    // P3M0 |= 0x0C;  

    // 配置使用P5.4和P5.5作为SCL和SDA输出引脚
	  P_SW2 = (P_SW2 & ~0x30) | 0x10;		//I2C: I2CSCL(P5.4), I2CSDA(P5.5)
    P5M1 |= 0x30;   // P5.4和P5.5设置为开漏输出
    P5M0 |= 0x30;  
    // 当系统时钟为11.0592MHz时, I2C时钟频率为100kHz
    I2CCFG = 0xE0;  // 设置I2C时钟频率(约100kHz)
    I2CMSST = 0x00; // 清除状态寄存器
}

// I2C启动信号
void I2C_Start(void) {
    I2CMSCR = 0x01; // 发送START信号
    while(!(I2CMSST & 0x80)); // 等待 MSBUSY 为1
    I2CMSST &= ~0x40; // 清除中断标志
}

// I2C停止信号
void I2C_Stop(void) {
    I2CMSCR = 0x06; // 发送STOP信号
}

// I2C发送一个字节
bit I2C_WriteByte(unsigned char dat) {
    I2CTXD = dat;
    I2CMSCR = 0x0A; // 发送数据并接收ack信号
    while(!(I2CMSST & 0x40)); // 等待发送完成
    I2CMSST &= ~0x40;
    return 1; 
}

// I2C读取一个字节
unsigned char I2C_ReadByte(bit ack) {
    I2CMSCR = ack ? 0x0B : 0x0C; // 设置ACK/NACK
    while(!(I2CMSST & 0x40)); // 等待接收完成
    I2CMSST &= ~0x40;
    return I2CRXD;
}